<?php

/**
 * Clase principal de manejo de los url e inclusion de librerias a nivel de sistema
 * Se han tomado algunas ideas de los metodos de la clase 
 * router.php de Kumbia PHP Framework V1.0
 * 
 * @author Robert Babilonia <bobbabilon2@gmail.com>
 * 
 * 
 * 
 */
final class CommanderRouter {

    /**
     * @var Array estatico con las variables del router
     */
    static private $vars = array(
        'route' => '', //Ruta pasada en el GET
        'module' => '', //Nombre del modulo actual
        'controller' => '', //Nombre del controlador actual
        'action' => 'index', //Nombre de la acción actual, por defecto index
        'id' => '', //Nombre del primer parametro despues de action
        'parameters' => array(), //Lista los parametros adicionales de la URL
        'all_parameters' => array() //Lista de Todos los parametros de la URL
    );

    /**
     * Toma $url y la descompone en aplicacion, (modulo), controlador, accion y argumentos
     * @param string $url
     */
    static function rewrite($url = "") {
        //Valor por defecto
        self::$vars['route'] = $url;

        if (((strpos($url, "?") === FALSE) || (strpos($url, "=") === FALSE))) {// se valida que no se reciban parametros por get
            // Se limpian los parametros por seguridad
            $clean = array('\\', '/../', '//');
            $url_sanitize = str_replace($clean, '', $url, $errors);

            if ($errors) {

                throw new CommanderException(ERROR_BAD_URL . " '$url'");
            } else {

                //Limpia la url en caso de que este escrita con el ultimo parametro sin valor es decir controller/action/
                $url = trim($url, '/');

                // Obtiene y asigna todos los parametros de la url
                $url_items = explode('/', $url);

                // Asigna todos los parametros
                self::$vars['all_parameters'] = $url_items;
                $parametros_c = count($url_items);


                if (CommanderApp::get_config('MODULAR_MODE_ON') === FALSE) {// modo modular apagado
                    if (CommanderApp::get_config('DEFAULT_MODULE_REQUEST')) {

                        self::$vars['module'] = CommanderApp::get_config('DEFAULT_MODULE_REQUEST');
                    } else {

                        throw new CommanderException(ERROR_BAD_URL3 . " '$url'");
                    }

                    // se verifica que el primer parametro sea el url frontal y que se tenga por lo menos el controlador
                    if ($parametros_c < 1) {

                        throw new CommanderException(ERROR_BAD_URL2 . " '$url'");
                    } else {

                        // Controlador
                        self::$vars['controller'] = strtolower(current($url_items));

                        if (self::$vars['controller'] == "" || is_null(self::$vars['controller'])) {

                            /* si no hay una peticion a un controlador en especifico se verifica 
                             * si una peticion por defecto esta configurada
                             */
                            if (CommanderApp::get_config('DEFAULT_CONTROLLER_REQUEST')) {
                            

                                self::$vars['controller'] = CommanderApp::get_config('DEFAULT_CONTROLLER_REQUEST');
                            } else {

                                throw new CommanderException(ERROR_BAD_URL2 . " '$url'");
                            }
                        }

                        // Si no hay mas parametros sale
                        if (next($url_items) === FALSE) {
                            return;
                        }

                        // Accion
                        self::$vars['action'] = strtolower(current($url_items));

                        // Si no hay mas parametros sale
                        if (next($url_items) === FALSE) {
                            return;
                        }

                        // id
                        self::$vars['id'] = current($url_items);

                        // Crea los parametros y los pasa, depues elimina el $url_items
                        $key = key($url_items);
                        $rest = count($url_items) - $key;
                        $parameters = array_slice($url_items, $key, $rest);

                        self::$vars['parameters'] = $parameters;
                        unset($url_items);
                    }
                } else {// esta activo el modo modular
                    // se verifica que el primer parametro sea el url frontal y que se tenga por lo menos el modulo y controlador
                    if ($parametros_c < 1) {

                        throw new CommanderException(ERROR_BAD_URL3 . " '$url'");
                    } else {


                        //modulo
                        self::$vars['module'] = strtolower(current($url_items));

                        if (self::$vars['module'] == "" || is_null(self::$vars['module'])) {

                            /* si no hay una peticion a un modulo en especifico se verifica 
                             * si una peticion por defecto esta configurada
                             */

                            if (CommanderApp::get_config('DEFAULT_MODULE_REQUEST')) {

                                self::$vars['module'] = CommanderApp::get_config('DEFAULT_MODULE_REQUEST');
                            } else {

                                throw new CommanderException(ERROR_BAD_URL3 . " '$url'");
                            }
                        }

                        //se pasa al siguiente elemento que debe ser el controlador
                        next($url_items);


                        // Controlador
                        self::$vars['controller'] = strtolower(current($url_items));

                        if (self::$vars['controller'] == "" || is_null(self::$vars['controller'])) {

                            /* si no hay una peticion a un controlador en especifico se verifica 
                             * si una peticion por defecto esta configurada
                             */

                            if (CommanderApp::get_config('DEFAULT_CONTROLLER_REQUEST')) {

                                self::$vars['controller'] = CommanderApp::get_config('DEFAULT_CONTROLLER_REQUEST');
                            } else {

                                throw new CommanderException(ERROR_BAD_URL2 . " '$url'");
                            }
                        }

                        // Si no hay mas parametros sale
                        if (next($url_items) === FALSE) {
                            return;
                        }

                        // Accion
                        self::$vars['action'] = strtolower(current($url_items));

                        // Si no hay mas parametros sale
                        if (next($url_items) === FALSE) {
                            return;
                        }

                        // id
                        self::$vars['id'] = current($url_items);

                        // Crea los parametros y los pasa, depues elimina el $url_items
                        $key = key($url_items);
                        $rest = count($url_items) - $key;
                        $parameters = array_slice($url_items, $key, $rest);

                        self::$vars['parameters'] = $parameters;
                        unset($url_items);
                    }
                }
            }
        } else {

            throw new CommanderException(ERROR_BAD_ROUTING);
        }
    }

    /**
     * Si se especifica el indice retorna el valor de este parametro, de lo 
     * contrario retorna el array de parametros completo
     * @param string $var Indica el indice que se desea obtener
     * @return array
     * */
    static public function get($var = null) {
        if ($var) {
            return self::$vars[$var];
        } else {
            return self::$vars;
        }
    }

   

   

}
